package cn.actoncode.boot.framework.zhipu.core.bean;

import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;

import java.util.List;

@Data
public class ChatGLMV4Request {

    /**
     * 所要调用的模型编码
     */
    private String model;

    /**
     * 用于区分每次请求的唯一标识编号
     */
    @JSONField(name = "request_id")
    private String requestId;

    /**
     * do_sample为true 时启用采样策略，do_sample为false 时采样策略temperature、top_p将不生效
     */
    @JSONField(name = "do_sample")
    private Boolean doSample = true;

    /**
     * 使用同步调用时，此参数应当设置为Fasle或者省略。表示模型生成完所有内容后一次性返回所有内容。
     * 如果设置为True，模型将通过标准 Event Stream ，逐块返回模型生成内容。Event Stream 结束时会返回一条data: [DONE]消息。
     */
    private Boolean stream;

    /**
     * 调用对话模型时，将当前对话信息列表作为提示输入给模型; 按照 {"role": "user", "content": "你好"} 的键值对形式进行传参; 总长度超过模型最长输入限制后会自动截断，需按时间由旧到新排序
     */
    private List<Message> messages;

    /**
     * 温度系数，取值>0.0，默认为1.0。更大的温度系数表示模型生成的多样性更强。取值范围0.5～1.0
     */
    private Double temperature;

    /**
     * topP采样又称核采样（Nucleus Sampling）。topP值会定义候选集在概率分布中的概率密度。若topP值为0.6，则解码器输出的概率密度的前60%会作为候选集。我们建议您不要与topK和temperature同时使用或同时进行调节。取值范围0～1.0，当topP为0时，该参数不起作用。
     */
    @JSONField(name = "top_p")
    private Double topP;

    /**
     * SSE接口调用时，用于控制每次返回内容方式是增量还是全量，不提供此参数时默认为增量返回
     * - true 为增量返回
     * - false 为全量返回
     */
    @JSONField(serialize = false)
    private boolean incremental = true;

    /**
     * 模型最大输出 tokens
     */
    @JSONField(name = "max_tokens")
    private int maxTokens = 4096;


    @Data
    public static class Message {

        /**
         * 本条信息作者的角色，可选择user 或 assistant
         * - user 指用户角色输入的信息
         * - assistant 指模型返回的信息
         */
        private String role;

        /**
         * 本条信息的具体内容
         */
        private String content;
    }
}
